package com.Jshop.cart.Service;

import com.Jshop.cart.entity.UserInfo;
import com.Jshop.cart.filter.LoginInterceptor;
import com.Jshop.cart.client.GoodsClient;
import com.Jshop.cart.pojo.Cart;
import com.Jshop.common.utils.JsonUtils;
import com.leyou.item.pojo.Sku;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.stream.Collectors;
/**
 * 当跳转到购物车页面，查询购物车列表前，需要判断用户登录状态
 * 在登录状态下将商品添加到购物车 放入redis（采用）避免购物车访问高峰对数据库造成压力
 *
 * 未登录状态下 （前端Vue去完成）
 * - 放入localstorage
 * - cookie
 * - webSQL
 * */
@Service
public class CartService {

    @Autowired
    private StringRedisTemplate redisTemplate;

    @Autowired
    private GoodsClient goodsClient;

    //在浏览器本地存储的购物车数据是存放于Redis数据库中的
    //所用的数据结构为Hash存储 以下是hash的key 公用购物车前缀+用户id
    static final String KEY_PREFIX = "Jshop:cart:uid:";

    static final Logger logger = LoggerFactory.getLogger(CartService.class);

    /**
     * 添加购物车
     * todo Jshop:cart:uid:1001  key > sku1 ...[price\name\img...] sku2 ...
     *
     * */
    public void addCart(Cart cart){
        //从ThreadLocal获取登录用户载荷信息 由前置拦截器放入
        UserInfo user= LoginInterceptor.getLoginUser();
        //Redis的 key为用户id+购物车前缀
        String key = KEY_PREFIX + user.getId();
        //获取Redis中hash key 为 此key 的hash操作对象
        BoundHashOperations<String, Object, Object> hashOps =
                this.redisTemplate.boundHashOps(key);
        //查询添加的商品的skuId
        Long skuId = cart.getSkuId();
        //数量
        Integer num = cart.getNum();
        //查询该商品在Redis中是否已经存在 此处看下Hash的数据结构 键 - 键值
        Boolean boo = hashOps.hasKey(skuId.toString());
        //存在 则获取购物车数据
        if (boo){
            String json = hashOps.get(skuId.toString()).toString();
            //将购物车JSON转化为Object
            cart = JsonUtils.parse(json,Cart.class);
            //修改购物车数量  + 1
            cart.setNum(cart.getNum() + num);
            //不存在 新增购物车数据
        }else {

            cart.setUserId(user.getId());
            Sku sku = this.goodsClient.querySkuById(skuId);
            cart.setImage(StringUtils.isBlank(sku.getImages()) ? "" : StringUtils.split(sku.getImages(),",")[0]);
            cart.setPrice(sku.getPrice());
            cart.setTitle(sku.getTitle());
            cart.setOwnSpec(sku.getOwnSpec());
        }
        //将购物车数据序列化写入redis  uid : skuid : skudetail
        hashOps.put(cart.getSkuId().toString(),JsonUtils.serialize(cart));

    }


    /**
     * 查询购物车列表
     * */
    public List<Cart> queryCartList(){
        //从ThreadLocal获取登录用户
        UserInfo user = LoginInterceptor.getLoginUser();
        //判断是否存在购物车
        String key = KEY_PREFIX + user.getId();
        if (!this.redisTemplate.hasKey(key)){
            return null;
        }
        BoundHashOperations<String, Object, Object> hashOps = this.redisTemplate.boundHashOps(key);
        //这里拿到的是字符串
        List<Object> carts = hashOps.values();
        //判断是否有数据
        if (CollectionUtils.isEmpty(carts)){
            return null;
        }
        //返回购物车数据（反序列化为对象）
        return carts.stream().map(o -> JsonUtils.parse(o.toString(),Cart.class)).collect(Collectors.toList());
    }

}
